package com.cyf.common.core.codec;

import com.cyf.common.core.io.FileUtil;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @author chenyifan
 * @create 2024-08-13 11:12
 */
public class Base64Util {
    
    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;


    // ------------------------------------ 编码方法 -----------------------------------------------

    /**
     * 对给定的字节数组进行 Base64 编码
     * @param src 原始字节数组
     * @return 编码字节数组
     */
    public static byte[] encode(byte[] src) {
        return src.length == 0 ? src : Base64.getEncoder().encode(src);
    }

    /**
     * Base64 将给定的字节数组编码为 String
     * @param src 原始字节数组
     * @return  UTF-8 字符串
     */
    public static String encodeToString(byte[] src) {
        return new String(encode(src), DEFAULT_CHARSET);
    }

    /**
     * 使用 RFC 4648“URL 和文件名安全字母表”对给定的字节数组进行 Base64 编码。
     * @param src 原始字节数组
     * @return 编码字节数组
     */
    public static byte[] encodeUrlSafe(byte[] src) {
        return src.length == 0 ? src : Base64.getUrlEncoder().encode(src);
    }

    /**
     * 使用 RFC 4648“URL 和文件名安全字母表”将给定的字节数组进行 Base64 编码为字符串。
     * @param src 原始字节数组
     * @return UTF-8 字符串
     */
    public static String encodeToUrlSafeString(byte[] src) {
        return new String(encodeUrlSafe(src), DEFAULT_CHARSET);
    }




    // ------------------------------------- 解码方法 --------------------------------------------------

    /**
     * 对给定的字节数组进行 Base64 解码
     * @param src 编码字节数组
     * @return 原始字节数组
     */
    public static byte[] decode(byte[] src) {
        return src.length == 0 ? src : Base64.getDecoder().decode(src);
    }

    /**
     * Base64 从 UTF-8 字符串解码给定的字节数组
     * @param src UTF-8 字符串
     * @return 原始字节数组
     */
    public static byte[] decodeFromString(String src) {
        return decode(src.getBytes(DEFAULT_CHARSET));
    }

    /**
     * 使用 RFC 4648“URL 和文件名安全字母表”对给定的字节数组进行 Base64 解码。
     * @param src 编码字节数组
     * @return 原始字节数组
     */
    public static byte[] decodeUrlSafe(byte[] src) {
        return src.length == 0 ? src : Base64.getUrlDecoder().decode(src);
    }

    /**
     * Base64 使用 RFC 4648“URL 和文件名安全字母表”从 UTF-8 字符串解码给定的字节数组
     * @param src UTF-8 字符串
     * @return 原始字节数组
     */
    public static byte[] decodeFromUrlSafeString(String src) {
        return decodeUrlSafe(src.getBytes(DEFAULT_CHARSET));
    }




    // --------------------------------- 写入文件 -----------------------------------------------
    /**
     * 将 Base64 字符串解码后写入文件
     * @param src Base64 编码的字符串
     * @param file 文件
     * @return
     */
    public static void base64ToFile(String src, File file) throws IOException {
        // Base64解码
        byte[] bytes = decodeFromString(src);
        FileUtil.writeBytesToFile(file, bytes);
    }

}
